//
//  HMComposeViewController.swift
//  Weibo22
//
//  Created by Apple on 16/12/9.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit
import SVProgressHUD

//  发微博视图控制器
class HMComposeViewController: UIViewController {

    //  MARK: -- 懒加载
    private lazy var titleLabel: UILabel = {
        let label = UILabel(fontSize: 17, textColor: UIColor.darkGray)
        
        if let name = HMUserAccountViewModel.sharedUserAccount.userAccount?.name {
//            label.text = "发微博\n\(name)"
            
            let result = "发微博\n\(name)"
            //  创建富文本对象
            let attributedStr: NSMutableAttributedString = NSMutableAttributedString(string: result)
            //  获取名字对应的范围
            let range = (result as NSString).range(of: name)
            
            attributedStr.addAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: 12), NSForegroundColorAttributeName: UIColor.brown], range: range)
            
            label.attributedText = attributedStr
        } else {
            label.text = "发微博"
        }
        //  文本居中显示
        label.textAlignment = .center
        //  多行显示
        label.numberOfLines = 0
        label.sizeToFit()
        return label
    }()
    
    //  发送按钮
    private lazy var sendButton: UIButton = {
        let button = UIButton()
        //  添加点击事件
        button.addTarget(self, action: #selector(sendAction), for: .touchUpInside)
        //  设置不同状态下的背景图片
        button.setBackgroundImage(UIImage(named: "common_button_orange"), for: .normal)
        button.setBackgroundImage(UIImage(named: "common_button_orange_highlighted"), for: .highlighted)
        button.setBackgroundImage(UIImage(named: "common_button_white_disable"), for: .disabled)
        //  设置文字
        button.setTitle("发送", for: .normal)
        button.titleLabel?.font = UIFont.systemFont(ofSize: 15)
        button.setTitleColor(UIColor.white, for: .normal)
        button.setTitleColor(UIColor.gray, for: .disabled)
        
        //  设置大小
        button.size = CGSize(width: 45, height: 35)
        return button
        
    }()
    
    fileprivate lazy var textView: HMComposeTextView = {
        let textView = HMComposeTextView()
        textView.placeHolder = "请输入内容~请输入内容~请输入内容~请输入内容~请输入内容~请输入内容~请输入内容~请输入内容~"
        //  设置代理
        textView.delegate = self
        textView.font = UIFont.systemFont(ofSize: 14)
        //  设置垂直方向拖动
        textView.alwaysBounceVertical = true
        
        //  设置纠错提示
//        textView.autocorrectionType = .no
        
        return textView
    }()
    
    //  toolbar视图
    fileprivate lazy var toolBar: HMComposeToolBar = {
        let toolBar = HMComposeToolBar()
        return toolBar
    }()
    //  发微博配图信息
    fileprivate lazy var pictureView: HMComposePictureView = {
        let pictureView = HMComposePictureView()
        pictureView.backgroundColor = self.textView.backgroundColor
        return pictureView
    }()
    //  表情键盘
    fileprivate lazy var emoticonKeyBoard: HMEmoticonKeyBoard = {
        let keyBoard = HMEmoticonKeyBoard()
        //  设置自定义表情键盘的高度
        keyBoard.size = CGSize(width: ScreenWidth, height: 216)
        return keyBoard
    }()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }
    
    private func setupNavUI() {
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "取消", target: self, action: #selector(cancelAction))
        //  自定义titleview视图
        navigationItem.titleView = titleLabel
        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: sendButton)
        //  默认发送按钮不可用
        navigationItem.rightBarButtonItem?.isEnabled = false
        
        
    
    }
    //  点击取消按钮的事件
    @objc private func cancelAction() {
        self.view.endEditing(true)
        dismiss(animated: true, completion: nil)
    
    }
    //  发送文字微博
    @objc private func sendAction() {
        //  以下代码抽取到HMComposeTextView+Extension里面
        //        var result = ""
//        //  遍历富文本
//        textView.attributedText.enumerateAttributes(in: NSMakeRange(0, textView.attributedText.length), options: [], using: {(info, range, _) -> Void in
//            //  info : 富文本的信息
//            //  range: 富文本的范围
//            print(info)
//            print(NSStringFromRange(range))
//           
//            if let attachment = info["NSAttachment"] as? HMTextAttachment {
//                //  图片表情富文本
//                let chs = attachment.emoticon?.chs
//                result += chs!
//            } else {
//                //  内容富文本
//                //  通过返回获取对应范围的富文本
//                //  通过string属性获取富文本对应的字符串
//                let text = textView.attributedText.attributedSubstring(from: range).string
//                result += text
//            }
//            
//            
//            
//        
//        
//        })
        
        
        
        // 获取微博内容
        let text = textView.emoticonText  //textView.text!
        
        SVProgressHUD.show()
        
        if pictureView.images.count > 0 {
            //  有图片
            let image = pictureView.images.first!
            HMNetworkTools.sharedTools.upload(status: text, image: image, callBack: { (response, error) in
                if error != nil {
                    print(error!)
                    SVProgressHUD.showError(withStatus: "发送失败")
                    return
                }
                
                SVProgressHUD.showSuccess(withStatus: "发送成功")
                
            })
            
            
        } else {
            HMNetworkTools.sharedTools.update(status: text, callBack: { (response, error) -> Void in
                if error != nil {
                    print(error!)
                    SVProgressHUD.showError(withStatus: "发送失败")
                    return
                }
                
                //  代码执行到此,表示发送微博数据成功
                SVProgressHUD.showSuccess(withStatus: "发送成功")
                
            })

        }
        
        
        
        
        
    }
    
    
    private func setupUI() {
        //  监听键盘的frame的改变
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardFrameChange(noti:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
        //  监听表情按钮的点击
        NotificationCenter.default.addObserver(self, selector: #selector(didSelecteEmoticonAction(noti:)), name: NSNotification.Name(DidSelectedEmoitconNotificationName), object: nil)
        //  监听删除表情按钮的通知
        NotificationCenter.default.addObserver(self, selector: #selector(didSelectDeleteEmoticonAction), name: NSNotification.Name(DidSelectedDeleteEmoticonNotificationName), object: nil)
        
        view.backgroundColor = UIColor.white
        setupNavUI()
        view.addSubview(textView)
        textView.addSubview(pictureView)
        
        view.addSubview(toolBar)
        
        
        textView.snp_makeConstraints { (make) in
            make.top.equalTo(view)
            make.leading.equalTo(view)
            make.trailing.equalTo(view)
            make.bottom.equalTo(toolBar.snp_top)
        }
        
        pictureView.snp_makeConstraints { (make) in
            make.top.equalTo(textView).offset(100)
            make.centerX.equalTo(textView)
            make.size.equalTo(CGSize(width: ScreenWidth - 20, height: ScreenWidth - 20))
        }
        
        toolBar.snp_makeConstraints { (make) in
            make.bottom.equalTo(view)
            make.leading.equalTo(view)
            make.trailing.equalTo(view)
            make.height.equalTo(35)
        }
        
        //  使用self需要注意循环引用
        toolBar.callBack = { [weak self] (type) -> Void in
            switch type {
            case .picture:
                print("点击图片")
                self?.didSelectedPicture()
                
            case .mention:
                print("@")
            case .trend:
                print("#")
            case .emoticon:
                print("表情")
                self?.didSelectedEmoticon()
                
                
            case .add:
                print("加号")
            }
        }
        
        //  使用self注意循环因信用
        pictureView.callBack = { [weak self] in
            self?.didSelectedPicture()
        }
        
    }
    //  MARK: -- 点击删除表情按钮的操作
    @objc private func didSelectDeleteEmoticonAction() {
    
        //  删除操作
        textView.deleteBackward()
    
    }
    
    
    //  MARK: -- 监听表情按钮点击的方法
    @objc private func didSelecteEmoticonAction(noti: Notification) {
    
    
        let emoticon = noti.object as! HMEmoticon
        
        textView.insertEmoticon(emoticon: emoticon)
        
        
        //  把点击的表情保存到最近表情数组里面
        HMEmoticonTools.sharedTools.saveRecentEmoticonArray(emoticon: emoticon)
        
        //  最近表情的数据会发生改变, 需要重新加载最近表情这组数据
        emoticonKeyBoard.reloadRecentEmotionData()
        
        
        //  代码已经抽取到HMComposeTextView+Extension里面
//        if emoticon.type == "0" {
//            //  图片表情
//            print(emoticon.chs!)
////            textView.insertText(emoticon.chs!)
//            
//            //  图片转成富文本的步骤
//            
//            //  记录上一次的富文本
//            let lastAttributedString = NSMutableAttributedString(attributedString: textView.attributedText)
//            
//            
//            //  1. 通过图片名(图片路径)创建UIImage对象
//            let image = UIImage(named: emoticon.path!)
//            
//            //  2. 根据UIImage对象创建文本附件(NSTextAttachment)
//            let attachment = NSTextAttachment()
//            //  设置文本附件的图片
//            attachment.image = image
//            //  文字高度
//            let lineHeight = textView.font!.lineHeight
//            //  设置图片大小 (设置bounds 会影响子控件的布局)
//            attachment.bounds = CGRect(x: 0, y: -4, width: lineHeight, height: lineHeight)
//            
//            //  3. 根据富文本附件创建富文本(NSAttributedString)
//            let attributedStr = NSAttributedString(attachment: attachment)
//            
//            
//            //  追加富文本
////            lastAttributedString.append(attributedStr)
//            
//            //  获取选中的范围
//            var range = textView.selectedRange
//            //  替换选中范围的富文本
//            lastAttributedString.replaceCharacters(in: range, with: attributedStr)
//            
//            
//            
//            //  设置富文本的字体大小
//            lastAttributedString.addAttribute(NSFontAttributeName, value: textView.font!, range: NSMakeRange(0, lastAttributedString.length))
//            
//            //  4. 设置富文本(attributedText)
//            textView.attributedText = lastAttributedString
//            
//            //  设置选中范围的光标位置
//            range.location += 1
//            //  设置范围长度
//            range.length = 0
//            
//            //  设置光标位置
//            textView.selectedRange = range
//            
//            //  发送文字改变的通知
//            NotificationCenter.default.post(name: NSNotification.Name.UITextViewTextDidChange, object: nil)
//            //  使用调用代理方法
//            //  这里使用!也是没有问题的,因为我们已经实现了这个代理方法
//            //  textViewDidChange 是这个协议的可选的代理方法,可以不用实现,如果使用了! 表示我确定我的这个方法一定实现了, 如果没有实现就会崩溃
//            //  ? 使用判断这个方法是否实现如果没有显示直接返回nil,不会崩溃
//            textView.delegate?.textViewDidChange?(textView)
//            
//            
//            
//            
//            
//            
//            
//            
//            
//        } else {
//            //  emoji
//            print((emoticon.code! as NSString).emoji())
//            textView.insertText((emoticon.code! as NSString).emoji())
//        }
        
        
        
    }
    
    //  MARK: -- 监听键盘frame改变的通知方法
    @objc private func keyboardFrameChange(noti: Notification) {
        
        
        //  获取键盘的frame
        let keyboardFrame = (noti.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        //  获取键盘动画时长
        let duration = (noti.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue
        //  更新约束
        toolBar.snp_updateConstraints { (make) in
            make.bottom.equalTo(view).offset(keyboardFrame.origin.y - ScreenHeight)
        }
        
        //  约束动画
        UIView.animate(withDuration: duration, animations: {
            self.view.layoutIfNeeded()
        })
        
        
        
    
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self)
    }

   

}

//  MARK: -- toolBar按钮点击操作
extension HMComposeViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    //  点击表情的处理方法
    func didSelectedEmoticon() {
        
        if textView.inputView == nil {
            //  完成切换输入视图
            //  成为表情键盘
            textView.inputView = emoticonKeyBoard
            toolBar.showIcon(isEmoticon: true)
        } else {
            //  成为系统键盘
            textView.inputView = nil
            toolBar.showIcon(isEmoticon: false)
        }
        
        //  辅助视图
//        textView.inputAccessoryView
        //  设置成为第一响应者
        textView.becomeFirstResponder()
        //  重写加载自定义的inputView
        textView.reloadInputViews()
    
    }
    
    
    
    //  点击图片处理的方法
    func didSelectedPicture() {
        //  创建图片浏览器
        let imagePikerCtr = UIImagePickerController()
        //  设置代理对象
        imagePikerCtr.delegate = self
        
        //  判断来源
        if UIImagePickerController.isSourceTypeAvailable(.camera) {
            //  表示相机可以
            imagePikerCtr.sourceType = .camera
        } else {
            //  模拟器使用图库
            imagePikerCtr.sourceType = .photoLibrary
        }
        //  允许编辑(想要编辑的图片,需要设置这个属性)
//        imagePikerCtr.allowsEditing = true
        
        //  判断前置摄像头或者后置摄像头是否可用
        if UIImagePickerController.isCameraDeviceAvailable(.front) {
            //  
            print("前置摄像头可用")
        }
        if UIImagePickerController.isCameraDeviceAvailable(.rear) {
            print("后置设置头可用")
        }
        
        
        self.present(imagePikerCtr, animated: true, completion: nil)
        
        
        
        
    }
    
    
    //  MARK: -- UIImagePickerControllerDelegate
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let image = info[UIImagePickerControllerOriginalImage] as! UIImage
        //  获取压缩后的图片
        let scaleImage = self.scaleImage(scaleWidth: 200, image: image)
        //  显示配图数据
        pictureView.addImage(image: scaleImage)
        
        
        picker.dismiss(animated: true, completion: nil)
    }
    
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        //  
        picker.dismiss(animated: true, completion: nil)
    }
    
    //  根据指定压缩后的宽度,完成等比压缩图片
    func scaleImage(scaleWidth: CGFloat, image: UIImage) -> UIImage {
        // 根据压缩后的宽度计算压缩后的高度
        let scaleHeight = scaleWidth / image.size.width * image.size.height
        //  压缩后的大小
        let scaleSize = CGSize(width: scaleWidth, height: scaleHeight)
        
        //  开启图片上下文
        UIGraphicsBeginImageContext(scaleSize)
        //  把图片渲染到指定区域内
        image.draw(in: CGRect(origin: CGPoint.zero, size: scaleSize))
        //  通过图片上下文获取图片
        let currentImage = UIGraphicsGetImageFromCurrentImageContext()
    
        
        //  结束图片上下文
        UIGraphicsEndImageContext()
        return currentImage!
    }
    
    
}




//  MARK: -- UITextViewDelegate
extension HMComposeViewController: UITextViewDelegate {
    //  文字改变的代理方法
    func textViewDidChange(_ textView: UITextView) {
        //  根据是否有内容设置右边按钮是否可用
        navigationItem.rightBarButtonItem?.isEnabled = textView.hasText
        
    }
    
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        //  键盘失去第一响应者
        self.view.endEditing(true)
    }
    
    
}








